package com.vogue.supplymall.common.domain.tool;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 存储本次请求访问的马甲名称
 * @author cy
 *
 */
public class VestUtils {

    public static final Logger LOGGER_VESTUTILS = LoggerFactory.getLogger(VestUtils.class);
    
	private static ThreadLocal<String> name = new ThreadLocal<>();// 马甲名称

	private static ThreadLocal<String> tendid = new ThreadLocal<>();// 分区编号
	
	private static ThreadLocal<String> payTogether = new ThreadLocal<>();// （合并/单）笔支付     0:单笔 1:合并
	
	private static ThreadLocal<String> entryMode = new ThreadLocal<>();// （延时/立即）入账方式   0:即时 1:延时
	
	private static ThreadLocal<String> version = new ThreadLocal<>(); // 当前访问应用版本号
	
    /** PC 电脑端注册        空  手机注册 */
    private static ThreadLocal<String> origin = new ThreadLocal<>();
    
    /** 系统  手机端：ios/android */
    private static ThreadLocal<String> system = new ThreadLocal<>();
	
    /** 客户端访问的ip地址 */
    private static ThreadLocal<String> clientIp = new ThreadLocal<>();
    
	private static String verRegEx = "(\\d*){1,}\\.{1}(\\d*){1,}\\.{1}(\\d*){1,}$";//版本号规则
	
	public static void clear() {
	    removeName();
	    removePayTogether();
	    removeEntryMode();
	    removeTendid();
	    removeVersion();
        removeOrigin();
        removeSystem();
        removeClientIp();
	}
	/** 分区编号 */
	public static String getTendid() {
        return tendid.get();
    }

    public static void setTendid(String id) {
        tendid.set(id);
    }

    public static void removeTendid() {
        tendid.remove();
    }
    /** 马甲名称 */
	public static String getName() {
		return name.get();
	}

	public static void setName(String vname) {
		name.set(vname);
	}

	public static void removeName() {
		name.remove();
	}

    public static void setPayTogether(String payTogetherFlag) {
        payTogether.set(payTogetherFlag);
    }

    public static void setEntryMode(String entryModeFlag) {
        entryMode.set(entryModeFlag);
    }	
	/** （合并/单）笔支付     0:单笔 1:合并 */
    public static String getPayTogether() {
        return payTogether.get();
    }
    /** （延时/立即）入账方式   0:即时 1:延时 */
    public static String getEntryMode() {
        return entryMode.get();
    }
    
    public static void removePayTogether() {
        payTogether.remove();
    }

    public static void removeEntryMode() {
        entryMode.remove();
    }
    /** 当前访问应用版本号 */
    public static String getVersion() {
        return version.get();
    }

    public static void setVersion(String ver) {
        version.set(ver);
    } 

    public static void removeVersion() {
        version.remove();
    }
    public static void setOrigin(String org){
        origin.set(org);
    }

    public static void removeOrigin(){
        origin.remove();
    }

    public static String getOrigin(){
        return origin.get();
    }

    public static void setSystem(String sys){
        system.set(sys);
    }

    public static void removeSystem(){
        system.remove();
    }

    public static String getSystem(){
        return system.get();
    }
    
    
    public static String getClientIp() {
        return clientIp.get();
    }
    
    public static void setClientIp(String ip) {
        clientIp.set(ip);
    }
    
    public static void removeClientIp(){
        clientIp.remove();
    }
    
    /**
     * 查看是否为合并支付
     * @return true 是 false 否
     */
    public static Boolean isPayTogether() {
        return isPayTogether(getPayTogether());
    }
    /**
     * 查看是否为合并支付
     * @param flag 判断依据标志
     * @return true 是 false 否
     */
    public static Boolean isPayTogether(String flag) {
        return !"0".equals(flag);
    }
    /**
     * 查看是否为延时到账支付方式
     * @return true 是 false 否
     */
    public static Boolean isDelayEntryMode() {
        return isDelayEntryMode(getEntryMode());
    }
    /**
     * 查看是否为延时到账支付方式
     * @param flag 判断依据标志
     * @return true 是 false 否
     */
    public static Boolean isDelayEntryMode(String flag) {
        return !"0".equals(flag);
    }

    public static Boolean isVisitFromPC() {
        return "PC".equalsIgnoreCase(getOrigin());
    }

    public static Boolean isVisitFromTEL() {
        return "TEL".equalsIgnoreCase(getOrigin());
    }
    /**
     * 查看当前APP版本号是否有效
     * @param sysVersion 当前系统的最新版本号
     * @return true 有效  false 无效（需要升级）
     */
    public static Boolean isVersionEffectual(String sysVersion) {
        //去v处理
        if (sysVersion.toLowerCase().startsWith("v")) {
            sysVersion = sysVersion.substring(1);
        }
        // 编译正则表达式
        Pattern pattern = Pattern.compile(verRegEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        if (getVersion() == null) {
            LOGGER_VESTUTILS.error("{}APP头信息缺少必要的版本号信息",  getName());
            return false;           
        } else {
            Matcher matcher = pattern.matcher(getVersion());
            if (!matcher.matches()) {
                LOGGER_VESTUTILS.error("{}APP头信息传递的版本号格式不正确{}",  getName(), getVersion());
                return false;
            } else {
                if (sysVersion == null) {
                    LOGGER_VESTUTILS.error("{}管理后台缺少必要的版本号",  getName());
                    return true;
                } else {
                    matcher = pattern.matcher(sysVersion);
                    if (!matcher.matches()) {
                        LOGGER_VESTUTILS.error("{}管理后台传递的最新版本号格式不正确{}",  getName(), sysVersion);
                        return false;
                    } else {
                        String [] userVer = getVersion().split("\\.");
                        String [] curVer = sysVersion.split("\\.");
                        if (Integer.parseInt(curVer[0]) > Integer.parseInt(userVer[0]) || Integer.parseInt(curVer[1]) > Integer.parseInt(userVer[1])) {
                            LOGGER_VESTUTILS.error("{}用户版本{},当前版本{},版本过低需要升级!", getName(), getVersion(), sysVersion);
                            return false;
                        } else {
                            return true;
                        }                        
                    }
                }
            }            
        }
    }
}
